package cn.com.lsy.product.lepao.util;

import java.security.DigestException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;

/**
 * 验证参数签名工具类
 *
 * @author 99490
 */
public class CheckSignUtil {

	/**
	 * 开始验证签名
	 *
	 * @param body
	 *            请求参数
	 * @param sign
	 *            签名字符串
	 * @param appId
	 *            签名appId
	 * @return
	 * @throws DigestException
	 */
	public static boolean check(String body, String signParam) throws DigestException {
		return true;
		/*
		 * if (StringUtils.isEmpty(body)) {
		 * 
		 * return true;
		 * 
		 * }
		 * 
		 * if (!StringUtils.isEmpty(signParam)) {
		 * 
		 * // 将参数转为map结构的数据 Map<String, Object> mapTypes = JSON.parseObject(body);
		 * String signStr = sign(mapTypes, Constant.getAppConfig.appSecret);
		 * 
		 * 
		 * if (signStr.equals(signParam)) {
		 * 
		 * return true;
		 * 
		 * } else { return false; }
		 * 
		 * } else { return false; }
		 */

	}

	/**
	 * 得到签名字符串
	 *
	 * @param map
	 * @return
	 * @throws DigestException
	 * @serverSecret 签名秘钥
	 */
	public static String sign(Map<String, Object> map, String serverSecret) throws DigestException {

		String sign = "";// 签名字符串

		// 将参数进行升序排序得到签名的map
		Map<String, Object> param = sortMapByKey(map);

		// 拼接签名字符串
		String str = "";
		for (Map.Entry<String, Object> m : param.entrySet()) {
			str += m.getKey() + m.getValue();
		}

		str += serverSecret;
		sign = SHA1(str);

		return sign;
	}

	/**
	 * 使用 Map按key进行升序排序
	 *
	 * @param map
	 * @return
	 */
	public static Map<String, Object> sortMapByKey(Map<String, Object> map) {
		if (map == null || map.isEmpty()) {
			return null;
		}
		Map<String, Object> sortMap = new TreeMap<String, Object>(new Comparator<String>() {
			public int compare(String str1, String str2) {
				return str1.compareTo(str2);// 将str1和str2调换位置是倒序排序
			}
		});
		sortMap.putAll(map);
		return sortMap;
	}

	/**
	 * SHA1 安全加密算法
	 *
	 * @param maps
	 *            参数key-value map集合
	 * @return
	 * @throws DigestException
	 */
	public static String SHA1(String str) throws DigestException {
		// 获取信息摘要 - 参数字典排序后字符串

		try {
			// 指定sha1算法
			MessageDigest digest = MessageDigest.getInstance("SHA-1");
			digest.update(str.getBytes());
			// 获取字节数组
			byte messageDigest[] = digest.digest();
			// Create Hex String
			StringBuffer hexString = new StringBuffer();
			// 字节数组转换为 十六进制 数
			for (int i = 0; i < messageDigest.length; i++) {
				String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
				if (shaHex.length() < 2) {
					hexString.append(0);
				}
				hexString.append(shaHex);
			}
			return hexString.toString().toUpperCase();

		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			throw new DigestException("签名错误！");
		}
	}
}
